package com.qf.shiro2204.config;

import com.qf.shiro2204.utils.Constants;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfig {

    /**
     * 定义 url和 shiro 过滤器之间的对应关系
     * 可以实现 shiro白名单功能
     * @return
     */
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition(){

        DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();

        // 白名单配置方法，过滤器名字为 anon （ anonymous 匿名的）
        definition.addPathDefinition("/regist.html","anon");

        // 登录接口放行
        definition.addPathDefinition("/user/login","anon");
        // 注册接口放行
        definition.addPathDefinition("/user/register","anon");

        // 放行mvc框架的 /error
        definition.addPathDefinition("/error","anon");


        // 可以使用shiro rememberme功能进行访问的url
        // rememberMe功能对应的shiro过滤器的名字是  user
        definition.addPathDefinition("/order/s","user");

        // 需要登录后才可以方法的 url 的配置, 过滤器的名字为 authc
//        definition.addPathDefinition("/bbb.html","authc");
//        definition.addPathDefinition("/aaa.html","authc");
//        definition.addPathDefinition("/hi/hi","authc");
        definition.addPathDefinition("/**","authc");

        return definition;
    }

    /**
     * shiro启动需要在IOC容器中放入  一个 Realm类型的对象
     * 这个对象的作用，提供必要的身份信息和权限信息
     * @return
     */
    @Bean
    public Realm customRealm(){

        CustomRealm customRealm = new CustomRealm();

        // 指定自定义realm使用的密码匹配器对象
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();

        // 设置hash匹配器使用的hash算法的名字
        hashedCredentialsMatcher.setHashAlgorithmName("md5");
        // 设置hash次数
        hashedCredentialsMatcher.setHashIterations(Constants.HASH_TIMES);

        customRealm.setCredentialsMatcher(hashedCredentialsMatcher);

        return customRealm;
    }

}
